package com.shop.shopmall.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shop.shopmall.dto.MaterialDto;
import com.shop.shopmall.pojo.TMaterial;
import com.shop.shopmall.service.TMaterialService;
import com.shop.shopmall.vo.Result;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.UUID;

/**
 * 素材管理控制器
 *
 * @author: Jamie
 * @date: 2025/3/31 16:09
 */
@RestController
public class MaterialController {

    @Autowired
    TMaterialService materialService;

    // 配置上传目录（可使用外部目录或项目中静态目录）
    @Value("${file.upload-dir}")
    private String uploadDir;

    /**
     * 相对路径的文件上传
     *
     * @param file       刷上传的文件
     * @param categoryId 上传文件的分类id
     * @return 成功
     */
    @PostMapping("/upload")
    public Result<?> upload(MultipartFile file, String categoryId) {
        try {
            // 获取相对路径的绝对路径
            Path uploadPath = Paths.get(uploadDir).toAbsolutePath().normalize();
            // 创建目录（如果不存在）
            if (!Files.exists(uploadPath)) {
                Files.createDirectories(uploadPath);
            }
            String replace = UUID.randomUUID().toString().replace("-", "");
            String substring = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            File file1 = new File(uploadPath.toString() + "/" + replace + substring);
            file.transferTo(file1);
            // 构建保存到数据库的对象
            TMaterial tMaterial = new TMaterial();
            tMaterial.setFileName(replace + substring);
            tMaterial.setClassify(categoryId);
            tMaterial.setFilePath(uploadDir + "/" + replace + substring);
            materialService.save(tMaterial);
            return Result.success("文件上传成功：" + replace + substring);
        } catch (IOException ex) {
            throw new RuntimeException("文件上传失败", ex);
        }
    }

    /**
     * 查询图片的分页
     *
     * @param categoryId 图片分类 不传查所有
     * @param page       第几页
     * @param size       每页多少条
     * @return 整个page对象
     */
    @GetMapping("/getMaterial/{categoryId}")
    public Result<?> getMaterial(@PathVariable String categoryId, int page, int size) {
        Page<TMaterial> tMaterialPage = new Page<>(page, size);
        LambdaQueryWrapper<TMaterial> tMaterialLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(categoryId) && !"0".equals(categoryId)) {
            tMaterialLambdaQueryWrapper.eq(TMaterial::getClassify, categoryId);
        }
        return Result.success(materialService.page(tMaterialPage, tMaterialLambdaQueryWrapper));
    }

    /**
     * 根据id数组批量更新分类id
     *
     * @return 成功返回结果
     */
    @PutMapping("/updClassify")
    public Result<?> putMaterial(@RequestBody MaterialDto materialDto) {
        UpdateWrapper<TMaterial> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("classify", materialDto.getCategoryId()).in("id",
                Arrays.stream(materialDto.getIds()).toList());
        return Result.success(materialService.update(updateWrapper));
    }

    /**
     * 批量删除文件
     *
     * @return 返回成功消息
     */
    @PostMapping("/delMaterial")
    public Result<?> deleteMaterial(@RequestBody MaterialDto materialDto) {
        // 获取相对路径的绝对路径
        Path uploadPath = Paths.get(uploadDir).toAbsolutePath().normalize();
        // 循环name数组 取出每一个文件名
        for (String name : materialDto.getFileName()) {
            // 拼接名称获取绝对路径
            File file = new File(uploadPath.toString() + "/" + name);
            // 判断文件夹是否存在
            if (file.exists()) {
                boolean deleted = file.delete();
                if (!deleted) {
                    // 如果删除失败，可以记录日志或返回部分删除成功信息
                    System.err.println("文件删除失败：" + file.getAbsolutePath());
                }
            }
        }
        UpdateWrapper<TMaterial> updateWrapper = new UpdateWrapper<>();
        updateWrapper.in("id", Arrays.stream(materialDto.getIds()).toList());
        return Result.success(materialService.remove(updateWrapper));
    }

}
